import 'dart:collection';
import 'core.dart';
/**
 *   PACKAGE:
 *   USER:Administrator
 *   TIME:2021/1/13 0013 21:15
 *   Description:解释器类，编译后最终结果保存位置
 *   模块装载顺序：core->project-> other module
 */

///模块类，module名字以文件路径区分
class Module {
  ///模块名
  final String name;

  ///模块路径
  final String filePath;

  ///模块是否被挂载,所有模块使用懒加载
  ///第一次调用模块时注册全局变量函数，可以没有
  ///主模块也可以使用全局变量函数
  bool _isLoad = false;

  bool get getLoad => _isLoad;

  set setLoad(bool Load) {
    ///挂载函数
    this._isLoad = Load;
    if (this._isLoad) {
      print("Load:" + name);
      function_list.forEach((entry) {
        if (entry.name == "setUp") {
          variable = LinkedList();
          print("setUp:");
        }
      });
    } else {
      print("upLoad:" + name);
      variable = null;
    }
  }

  ///该模块依赖的包名(也可能是重命名)及其所在位置
  HashMap imp;

  ///模块的函数，语句，全局变量
  LinkedList<Variable> variable;
  LinkedList<FunctionDefinition> function_list;
  LinkedList<Statement> statement_list;

  Module(this.name, this.filePath) {
    imp = HashMap<String, String>();
    variable = LinkedList();
    function_list = LinkedList();
    statement_list = LinkedList();
    ///默认添加core库依赖
    if (name != "core") imp.putIfAbsent("core", () => "cool.core");
  }

  @override
  String toString() {
    return " name:" +
        name +
        " isLoad:" +
        getLoad.toString() +
        " import:" +
        imp.toString();
  }
}

class Interpreter {
  /// 单例对象
  static Interpreter _instance;

  /// 内部构造方法，可避免外部暴露构造函数，进行实例化
  Interpreter._internal() {
    if (module == null) {
      module = HashMap();
    }
  }

  /// 工厂构造方法，这里使用命名构造函数方式进行声明
  factory Interpreter.getInstance() => _getInstance();

  /// 获取单例内部方法
  static _getInstance() {
    /// 只能有一个实例
    if (_instance == null) {
      _instance = Interpreter._internal();
    }
    return _instance;
  }

  ///编译后模块,第一个module为执行脚本，其余为导入脚本
  HashMap<String, Module> module;

  ///工程文件夹
  String proDir;

  ///主模块
  String mainModule;

  ///公共包文件夹
  String pubDir;

  ///是否为Debug运行
  bool isDebug = false;
}
